package com.yupi.yupicturebackend.manager;

import cn.hutool.Hutool;
import cn.hutool.core.io.FileUtil;
import cn.hutool.json.JSONUtil;
import com.qcloud.cos.COSClient;
import com.qcloud.cos.exception.CosClientException;
import com.qcloud.cos.model.*;
import com.qcloud.cos.model.ciModel.auditing.*;
import com.qcloud.cos.model.ciModel.persistence.PicOperations;
import com.yupi.yupicturebackend.config.CosClientConfig;
import com.yupi.yupicturebackend.exception.BusinessException;
import com.yupi.yupicturebackend.exception.ErrorCode;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Base64;
import java.util.List;

@Component
public class CosManager {

    @Resource
    private CosClientConfig cosClientConfig;

    @Resource
    private COSClient cosClient;

    // ... 一些操作 COS 的方法

    /**
     * 上传对象
     *
     * @param key  唯一键
     * @param file 文件
     */
    public PutObjectResult putObject(String key, File file) {
        PutObjectRequest putObjectRequest = new PutObjectRequest(cosClientConfig.getBucket(), key,
                file);
        return cosClient.putObject(putObjectRequest);
    }


    /**
     * 下载对象
     *
     * @param key 唯一键
     */
    public COSObject getObject(String key) {
        GetObjectRequest getObjectRequest = new GetObjectRequest(cosClientConfig.getBucket(), key);
        return cosClient.getObject(getObjectRequest);
    }


    /**
     * 上传对象（附带图片信息）
     *
     * @param key  唯一键
     * @param file 文件
     */
    public PutObjectResult putPictureObject(String key, File file) {
        PutObjectRequest putObjectRequest = new PutObjectRequest(cosClientConfig.getBucket(), key,
                file);
        // 对图片进行处理（获取基本信息也被视作为一种处理）
        PicOperations picOperations = new PicOperations();
        // 1 表示返回原图信息
        /**
         * setIsPicInfo
         * 在上传图片时，COS（Cloud Object Storage）服务会返回一些与图片相关的基本元数据（metadata）。这些元数据通常包括但不限于：
         * 图片的尺寸（宽度和高度）
         * 图片的格式（如 JPEG、PNG 等）
         * 图片的大小（文件字节数）
         * 其他可能的图片属性（如颜色深度、分辨率等）
         */
        picOperations.setIsPicInfo(1);
        List<PicOperations.Rule> rules = new ArrayList<>();
        // 图片压缩（转成 webp 格式）
        String webpKey = FileUtil.mainName(key) + ".webp";
        PicOperations.Rule compressRule = new PicOperations.Rule();
        compressRule.setRule("imageMogr2/format/webp");
        compressRule.setBucket(cosClientConfig.getBucket());
        compressRule.setFileId(webpKey);
        rules.add(compressRule);
//      如果原图的size本来就很小 那么再压缩 可能会适得其反
        // 缩略图处理，仅对 > 20 KB 的图片生成缩略图
        if (FileUtil.size(file) > 20 * 1024) {
            // 缩略图处理
            PicOperations.Rule thumbnailRule = new PicOperations.Rule();
            thumbnailRule.setBucket(cosClientConfig.getBucket());
            /**
             * 如果是批量爬取图片后 使用url格式导入图片 得的的图片url可能是没有格式的 导致 下面这里就可能拼接了的空
             * 所以 要在UrlPictureUpload里获取文件名字方法里 发送第二次head请求 获取图片格式
             */
            String thumbnailKey = FileUtil.mainName(key) + "_thumbnail." + FileUtil.getSuffix(key);
            thumbnailRule.setFileId(thumbnailKey);
            // 缩放规则 /thumbnail/<Width>x<Height>>（如果大于原图宽高，则不处理）
//        原图宽高只要大于256x256，就要处理
            thumbnailRule.setRule(String.format("imageMogr2/thumbnail/%sx%s>", 256, 256));
            rules.add(thumbnailRule);
        }

        // 构造处理参数
        picOperations.setRules(rules);

        // 构造处理参数
        putObjectRequest.setPicOperations(picOperations);
        return cosClient.putObject(putObjectRequest);
    }


    /**
     * 获取图片主色调
     *
     * @param key 文件 key
     * @return 图片主色调
     */
    public String getImageAve(String key) {
        GetObjectRequest getObj = new GetObjectRequest(cosClientConfig.getBucket(), key);
        String rule = "imageAve";
        getObj.putCustomQueryParameter(rule, null);
        COSObject object = cosClient.getObject(getObj);
        COSObjectInputStream objectContent = object.getObjectContent();
        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
            CloseableHttpResponse httpResponse = httpClient.execute(objectContent.getHttpRequest());
            String response = EntityUtils.toString(httpResponse.getEntity());
            return JSONUtil.parseObj(response).getStr("RGB");
        } catch (IOException e) {
            throw new BusinessException(ErrorCode.SYSTEM_ERROR);
        }
    }

    /**
     * 删除对象
     *
     * @param key 文件 key
     */
    public void deleteObject(String key) throws CosClientException {
        cosClient.deleteObject(cosClientConfig.getBucket(), key);
    }

    /**
     * ai审核图片  添加图片审核任务
     */
    public ImageAuditingResponse reviewImage(String key) {
//1.创建任务请求对象
        ImageAuditingRequest request = new ImageAuditingRequest();
//2.添加请求参数 参数详情请见 API 接口文档
//2.1设置请求 bucket
        String bucket = cosClientConfig.getBucket();
        request.setBucketName(bucket);
//2.2设置审核策略 不传则为默认策略（预设）
//request.setBizType("");
//2.3设置 bucket 中的图片位置
        String[] split = key.split(" ");
//        前半部分 获取的是url
        key = split[0];
        request.setObjectKey(key);
//3.调用接口,获取任务响应对象
        ImageAuditingResponse response = cosClient.imageAuditing(request);
        String jobId = response.getJobId();
        if (split.length > 1) {
            jobId = jobId + " " + split[1];
        }
        response.setJobId(jobId);
        return response;
    }


    /**
     * ai审核图片  查询图片任务
     */
    public ImageAuditingResponse selectReviewImage(String JobId) {

        //1.创建任务请求对象
        DescribeImageAuditingRequest request = new DescribeImageAuditingRequest();
//2.添加请求参数 参数详情请见api接口文档
        String bucket = cosClientConfig.getBucket();
        request.setBucketName(bucket);
        request.setJobId(JobId);
        ImageAuditingResponse response = cosClient.describeAuditingImageJob(request);
        return response;
    }

    /**
     * ai审核文本内容  添加文本审核任务
     */

    public TextAuditingResponse reviewText(String text) {
        //1.创建任务请求对象
        TextAuditingRequest request = new TextAuditingRequest();
//2.添加请求参数 参数详情请见 API 接口文档
        String bucket = cosClientConfig.getBucket();
        request.setBucketName(bucket);
//2.1.1设置请求内容,文本内容的Base64编码
        // 获取Base64编码器
        Base64.Encoder encoder = Base64.getEncoder();
        // 将文本内容编码为Base64格式
        String encodedText = encoder.encodeToString(text.getBytes());
        request.getInput().setContent(encodedText);
//或是cos中的设置对象地址 不可同时设置
//request.getInput().setObject("1.txt");
//2.2设置审核模板（可选）
//request.getConf().setBizType("aa3e9d84a6a079556b0109a935c*****");
//3.调用接口,获取任务响应对象
        // 3. 调用接口，获取任务响应对象
        try {
            return cosClient.createAuditingTextJobs(request);
        } catch (Exception e) {
            throw new BusinessException(ErrorCode.SYSTEM_ERROR, "文本审核失败：" + e.getMessage());
        }
    }

}
